package com.atguigu.tingshu.album.api;


import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.login.GuiguLogin;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "专辑管理")
@RestController
@RequestMapping("api/album")
@SuppressWarnings({"all"})
public class AlbumInfoApiController {

	@Autowired
	private AlbumInfoService albumInfoService;

	/**
	 * 添加专辑信息 请求体数据封装成了一个vo类 需要保存三张表数据
	 * albumInfo album_attribute_value album_stat(第三张表里面因为统计类型有4个属性 所以
	 * 要把保存类提取出来 然后调用方法分别保存不同的数据）
	 */
	@GuiguLogin
	@PostMapping("/albumInfo/saveAlbumInfo")
	public Result saveAlbumInfo(@RequestBody AlbumInfoVo albumInfoVo){
		//从本地线程中获取用户id
		Long userId = AuthContextHolder.getUserId();
		albumInfoService.saveAblumInfo(albumInfoVo,userId);
		return Result.ok();
	}

	/**
	 * 查询专辑分页信息
	 * @param page
	 * @param limit
	 * @param albumInfoQuery
	 * @return
	 */
	@PostMapping("/albumInfo/findUserAlbumPage/{page}/{limit}")
	public Result<Page<AlbumListVo>>getUserAlbumPage(@PathVariable Long page,
													 @PathVariable Long limit,
													 AlbumInfoQuery albumInfoQuery){
		Long userId = AuthContextHolder.getUserId();
		albumInfoQuery.setUserId(userId);
		//构建mybatisPlus的分页对象 语法如下
		Page<AlbumListVo>pageInfo = new Page<>(page,limit);
		pageInfo = albumInfoService.getUserAlbumPage(pageInfo,albumInfoQuery);
		return Result.ok(pageInfo);


	}

	/**
	 * 删除专辑信息 插入的时候是三张表 所以删除也是三张表
	 * album_info album_attribute_value album_stat
	 * 因为专辑里面主要包含声音信息 所以如果专辑里面有声音 则需要删除声音信息后再删除专辑信息
	 * 即需要加一个判断条件
	 */

	@DeleteMapping("/albumInfo/removeAlbumInfo/{id}")
	public Result removeAlbumInfo(@PathVariable Long id){
		albumInfoService.deleteAlbumInfo(id);
		return Result.ok();
	}


	/**
	 * 更新数据前需要进行数据回显 回显两张表数据
	 * 专辑信息表 和 专辑标签属性表
	 * @param id
	 * @return
	 */
	@GetMapping("/albumInfo/getAlbumInfo/{id}")
	public Result<AlbumInfo>getAlbumInfo(@PathVariable Long id){
		AlbumInfo albumInfo = albumInfoService.getAlbumInfo(id);
		return Result.ok(albumInfo);

	}

	/**
	 * 更新数据
	 * 思路跟新增数据类似
	 * 对一更新直接修改保存即可 对多更新可以先删除 然后重新添加更新
	 * @param id
	 * @return
	 */

	@PutMapping("/albumInfo/updateAlbumInfo/{id}")
	public Result updateAlbumInfo(@PathVariable Long id,@RequestBody AlbumInfoVo albumInfoVo){

		albumInfoService.updateAlbumInfo(id,albumInfoVo);
		return Result.ok();

	}

	/**
	 * 获取当前登录用户的所有专辑信息列表
	 * 因为当前用户上传声音接口中需要选择专辑 即把声音上传到哪个专辑下面
	 * 所以需要回显所有的专辑列表 一般回显最近添加的10条或者20条数据即可
	 */
	@GetMapping("/albumInfo/findUserAllAlbumList")
	public Result<List<AlbumInfo>>findUserAllAlbumList(){
		//从本地线程获取用户id
		Long userId = AuthContextHolder.getUserId();
		List<AlbumInfo>albumInfoList = albumInfoService.getUserAllAlbumList(userId);
		return Result.ok(albumInfoList);

	}




}

